import axios from "axios";
import { ElMessage } from "element-plus";
import router from "@/router";
import ErrorHandler from "@/utils/errorHandler";

const API_BASE_URL =
  import.meta.env.VITE_API_BASE_URL || "http://127.0.0.1:8001";

// 创建统一的API客户端实例
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  timeout: 30000,
});

// 请求拦截器
apiClient.interceptors.request.use(
  (config) => {
    // 添加traceId用于跟踪请求
    const traceId = localStorage.getItem("traceId") || crypto.randomUUID();
    localStorage.setItem("traceId", traceId);
    config.headers["X-Trace-Id"] = traceId;

    // 添加认证token如果存在
    const token = localStorage.getItem("authToken");
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }

    // 只在开发环境输出日志
    if (import.meta.env.DEV) {
      console.log("API请求:", config.method?.toUpperCase(), config.url);
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
apiClient.interceptors.response.use(
  (response) => {
    // 如果响应中包含traceId，可以在这里处理
    const traceId = response.headers["x-trace-id"];
    if (traceId && import.meta.env.DEV) {
      console.log(`Trace ID: ${traceId}`);
    }
    return response;
  },
  (error) => {
    // 统一处理错误
    if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status;

      if (status === 401) {
        // 未授权，清除token并跳转到登录页
        localStorage.removeItem("authToken");
        const redirectPath = router.currentRoute.value.fullPath;
        if (router.currentRoute.value.path !== "/login") {
          router.replace({
            path: "/login",
            query: {
              redirect: redirectPath !== "/login" ? redirectPath : undefined,
            },
          });
        }
        ErrorHandler.handleError(error, "身份验证", "server");
      } else if (status === 503) {
        // 服务不可用
        ErrorHandler.handleError(error, "服务不可用", "server");
      } else if (status >= 500) {
        // 服务器内部错误
        ErrorHandler.handleError(error, "服务器错误", "server");
      } else {
        // 其他HTTP错误
        ErrorHandler.handleError(error, "请求错误", "server");
      }
    } else if (error.request) {
      // 请求已发送但未收到响应，可能是网络错误或CORS错误
      if (
        error.message?.includes("CORS") ||
        error.message?.includes("Cross-Origin")
      ) {
        ErrorHandler.handleError(error, "跨域请求", "cors");
      } else {
        ErrorHandler.handleError(error, "网络连接", "network");
      }
    } else {
      // 请求配置出错
      ErrorHandler.handleError(error, "请求配置", "network");
    }

    return Promise.reject(error);
  }
);

// 导出统一的API客户端
export const api = apiClient;
export default apiClient;
